package br.com.equus.bean;

import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;
import org.primefaces.event.ScheduleEntrySelectEvent;
import org.primefaces.model.LazyScheduleModel;
import org.primefaces.model.ScheduleModel;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.entidade.Entidade;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.equus.dto.TipoClass;
import br.com.equus.entidade.AvaliacaoAnimal;
import br.com.equus.entidade.ItemEntrada;
import br.com.equus.entidade.ManejoAnimal;
import br.com.equus.entidade.MedicaoAnimal;
import br.com.equus.entidade.StatusExecucao;
import br.com.equus.entidade.StatusManejo;
import br.com.equus.service.AgendaService;
import br.com.equus.util.CustomSchedulerEvent;

@SuppressWarnings("rawtypes")
@ManagedBean(name = "scheduleBean")
@ViewScoped
public class ScheduleBean extends PaginableBean<Entidade> {

	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{agendaService}")
	protected AgendaService agendaService;

	private ScheduleModel scheduleModel;

	private String motivoCancelar;

	private ManejoAnimal manejo;

	private MedicaoAnimal medicaoAnimal;

	private AvaliacaoAnimal avaliacaoAnimal;

	private ItemEntrada itemEntrada;

	private String motivoFinalizar;

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_AGENDA");

	}

	public ScheduleBean() throws ParseException {

		manejo = new ManejoAnimal();
		scheduleModel = new LazyScheduleModel() {
			@Override
			public void loadEvents(Date start, Date end) {
				try {
					super.loadEvents(start, end);

					List<ManejoAnimal> listaManejo = agendaService.carregarListaManejo(start, end);
					List<ItemEntrada> listaItemValidade = agendaService.carregarListaItem(start, end);

					for (ManejoAnimal list : listaManejo) {
						scheduleModel.addEvent(new CustomSchedulerEvent(list.getId(), TipoClass.MANEJO, "Manejo-"
								+ list.getAnimal().getNome(), list.getDtInicio(), list.getDtFim()));
					}
					for (ItemEntrada list : listaItemValidade) {
						scheduleModel.addEvent(new CustomSchedulerEvent(list.getId(), TipoClass.ITEM_ENTRADA, list.getEntrada()
								.getNotaFiscal() + "-" + list.getProduto().getDescricao(), list.getDtValidade(), list.getDtValidade()));
					}

				} catch (Exception e) {
					ExcecaoUtil.tratarExcecao(e);
				}
			}
		};

	}

	public void onEventSelect(ScheduleEntrySelectEvent selectEvent) {
		CustomSchedulerEvent event = (CustomSchedulerEvent) selectEvent.getScheduleEvent();

		if (event.getTipoClass().equals(ManejoAnimal.class)) {
			manejo = (ManejoAnimal) universalManager.get(event.getTipoClass(), event.getIdObject());
			RequestContext requestContext = RequestContext.getCurrentInstance();
			requestContext.execute("manejoDialog.show()");
			return;
		}
		if (event.getTipoClass().equals(MedicaoAnimal.class)) {
			medicaoAnimal = (MedicaoAnimal) universalManager.get(event.getTipoClass(), event.getIdObject());
			RequestContext requestContext = RequestContext.getCurrentInstance();
			requestContext.execute("medicaoDialog.show()");
			return;
		}
		if (event.getTipoClass().equals(AvaliacaoAnimal.class)) {
			avaliacaoAnimal = (AvaliacaoAnimal) universalManager.get(event.getTipoClass(), event.getIdObject());
			RequestContext requestContext = RequestContext.getCurrentInstance();
			requestContext.execute("avaliacaoDialog.show()");
			return;
		}
		if (event.getTipoClass().equals(ItemEntrada.class)) {
			itemEntrada = (ItemEntrada) universalManager.get(event.getTipoClass(), event.getIdObject());
			RequestContext requestContext = RequestContext.getCurrentInstance();
			requestContext.execute("itemEntradaDialog.show()");
			return;
		}

	}

	public String cancelarManejo() {
		try {
			StatusManejo status = new StatusManejo();
			status.setDtCadastro(new Date());
			status.setManejoAnimal(new ManejoAnimal(manejo.getId()));
			status.setMotivo(motivoCancelar);
			status.setStatusExecucao(new StatusExecucao(StatusExecucao.CANCELADO));
			universalManager.save(status);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return redirect("principal.jsf");
	}

	public String finalizarManejo() {
		try {
			StatusManejo status = new StatusManejo();
			status.setDtCadastro(new Date());
			status.setManejoAnimal(new ManejoAnimal(manejo.getId()));
			status.setMotivo(motivoFinalizar);
			status.setStatusExecucao(new StatusExecucao(StatusExecucao.FINALIZADO));
			universalManager.save(status);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return redirect("principal.jsf");
	}

	@Override
	public Entidade createModel() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getQualifiedName() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean isFeminino() {
		// TODO Auto-generated method stub
		return false;
	}

	public ScheduleModel getScheduleModel() {
		return scheduleModel;
	}

	public void setScheduleModel(ScheduleModel scheduleModel) {
		this.scheduleModel = scheduleModel;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public AgendaService getAgendaService() {
		return agendaService;
	}

	public void setAgendaService(AgendaService agendaService) {
		this.agendaService = agendaService;
	}

	public ManejoAnimal getManejo() {
		return manejo;
	}

	public void setManejo(ManejoAnimal manejo) {
		this.manejo = manejo;
	}

	@Override
	public Map<String, String> getFilters() {
		// TODO Auto-generated method stub
		return null;
	}

	public String getMotivoCancelar() {
		return motivoCancelar;
	}

	public void setMotivoCancelar(String motivoCancelar) {
		this.motivoCancelar = motivoCancelar;
	}

	public String getMotivoFinalizar() {
		return motivoFinalizar;
	}

	public void setMotivoFinalizar(String motivoFinalizar) {
		this.motivoFinalizar = motivoFinalizar;
	}

	public MedicaoAnimal getMedicaoAnimal() {
		return medicaoAnimal;
	}

	public void setMedicaoAnimal(MedicaoAnimal medicaoAnimal) {
		this.medicaoAnimal = medicaoAnimal;
	}

	public AvaliacaoAnimal getAvaliacaoAnimal() {
		return avaliacaoAnimal;
	}

	public void setAvaliacaoAnimal(AvaliacaoAnimal avaliacaoAnimal) {
		this.avaliacaoAnimal = avaliacaoAnimal;
	}

	public ItemEntrada getItemEntrada() {
		return itemEntrada;
	}

	public void setItemEntrada(ItemEntrada itemEntrada) {
		this.itemEntrada = itemEntrada;
	}

}
